
//560.和为K的子数组
class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {
        //和为K的子数组:假设子数组为[left,right] 其一定是由[0,right] - [0,left-1] = k而来的
        //所以只要统计每一个[0,right]在前面找是否有一个[0,left - 1] = [0,right] - k的即可
        //此时就可将前缀和存储到哈希表中

        unordered_map<int,int> m ; //存储前缀和的值及个数
        m.insert({0,1});           //此处要将{0,1}插入,否则如果子数组就是[0,right]完整的前缀和就不需要减
        int n =  nums.size(), sum = 0 , ret = 0;
        for(int i = 0; i < n ; i++)
        {
            sum += nums[i];
            if(m.count(sum - k)) ret += m[sum-k];
            m[sum]++;
        }
        return ret;
    }
};